﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

using memoria_partilhada = BD2_5479_5513.SharedMemory;

namespace BD2_5479_5513
{
    class DatabaseControl
    {
        public SqlConnection ligacao_bd()
        {
            SqlConnection myConnection = new SqlConnection("user id=username;" +
                                           "password=password;server=localhost;" +
                                           "Trusted_Connection=yes;" +
                                           "database=bd_2_5479_5513; " +
                                           "connection timeout=10");
            try
            {
                myConnection.Open();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

            return myConnection;
        }

        public int getTipoUtilizador(string utilizador, string password)
        {
            SqlConnection myConnection = ligacao_bd();
            memoria_partilhada mem = new memoria_partilhada();

            var utilizador_local = utilizador;
            var password_local = password;
            var tipo_utilizador = 100;
            var statusUtilizador = false;
            var statusPassword = false;
            //var idUtilizador = "";

            SqlCommand myCommand = new SqlCommand("verificar_login", myConnection);
            myCommand.CommandType = CommandType.StoredProcedure;

            SqlParameter parament1 = new SqlParameter("@username", SqlDbType.NVarChar);
            parament1.Value = utilizador;
            parament1.Direction = ParameterDirection.Input;
            parament1.Size = 100;

            SqlParameter parament2 = new SqlParameter("@password", SqlDbType.NVarChar);
            parament2.Value = password;
            parament2.Direction = ParameterDirection.Input;
            parament2.Size = 100;

            SqlParameter parament3 = new SqlParameter("@resultado1", SqlDbType.Int);
            parament3.Direction = ParameterDirection.Output;

            SqlParameter parament4 = new SqlParameter("@resultado2", SqlDbType.NVarChar);
            parament4.Direction = ParameterDirection.Output;
            parament4.Size = 100;

            myCommand.Parameters.Add(parament1);
            myCommand.Parameters.Add(parament2);
            myCommand.Parameters.Add(parament3);
            myCommand.Parameters.Add(parament4);

            myCommand.ExecuteNonQuery();

            var cod_dados = myCommand.Parameters["@resultado1"].Value;
            var nome_utilizador = myCommand.Parameters["@resultado2"].Value;

            if (cod_dados.ToString() == "")
                //password ou utilizador errado
                statusUtilizador = false;

            else
            {
                statusUtilizador = true;
                statusPassword = true;

                mem.cod_dados = (Int32)cod_dados;
                mem.nome_utilizador = (String)nome_utilizador;
            }

            if (statusUtilizador == false)
            {
                tipo_utilizador = 98;
                //myConnection.Close();
                return tipo_utilizador;
            }

            else if (statusUtilizador == true && statusPassword == true)
            {
                //verificação se é aluno

                SqlCommand commandAluno = new SqlCommand("verifica_aluno", myConnection);
                commandAluno.CommandType = CommandType.StoredProcedure;

                SqlParameter paramentAluno1 = new SqlParameter("@cod_dados", SqlDbType.Int);
                paramentAluno1.Value = mem.cod_dados;
                parament1.Direction = ParameterDirection.Input;

                SqlParameter paramentAluno2 = new SqlParameter("@resultado", SqlDbType.Int);
                paramentAluno2.Direction = ParameterDirection.Output;

                commandAluno.Parameters.Add(paramentAluno1);
                commandAluno.Parameters.Add(paramentAluno2);

                commandAluno.ExecuteNonQuery();

                var cod_aluno = commandAluno.Parameters["@resultado"].Value;

                if (cod_aluno.ToString() != "")
                {
                    mem.codUtilizador = (Int32)cod_aluno;
                    tipo_utilizador = 0;
                    return tipo_utilizador;
                }

                else
                {
                    SqlCommand commandDocente = new SqlCommand("verifica_docente", myConnection);
                    commandDocente.CommandType = CommandType.StoredProcedure;

                    SqlParameter paramentDocente1 = new SqlParameter("@cod_dados", SqlDbType.Int);
                    paramentDocente1.Value = mem.cod_dados;
                    paramentDocente1.Direction = ParameterDirection.Input;

                    SqlParameter paramentDocente2 = new SqlParameter("@resultado", SqlDbType.Int);
                    paramentDocente2.Direction = ParameterDirection.Output;

                    commandDocente.Parameters.Add(paramentDocente1);
                    commandDocente.Parameters.Add(paramentDocente2);

                    commandDocente.ExecuteNonQuery();

                    var cod_docente = commandDocente.Parameters["@resultado"].Value;

                    if (cod_docente.ToString() != "")
                    {
                        mem.codUtilizador = (Int32)cod_docente;
                        tipo_utilizador = 1;
                        return tipo_utilizador;

                    }

                }

            }

            //nunca chega aqui mas tem de ter senão dá erro
            myConnection.Close();
            return tipo_utilizador;
        }

        public List<List<string>> getDisciplinasInscrito(int cod_utilizador)
        {
            SqlConnection myConnection = ligacao_bd();
            memoria_partilhada mem = new memoria_partilhada();

            SqlCommand commandListaInscrito = new SqlCommand("disciplinas_inscrito", myConnection);
            commandListaInscrito.CommandType = CommandType.StoredProcedure;

            SqlParameter paramentLista = new SqlParameter("@codigo_aluno", SqlDbType.Int);
            paramentLista.Value = cod_utilizador;
            paramentLista.Direction = ParameterDirection.Input;

            commandListaInscrito.Parameters.Add(paramentLista);

            DataTable disciplinas = new DataTable();

            SqlDataAdapter teste = new SqlDataAdapter(commandListaInscrito);

            teste.Fill(disciplinas);

            List<List<string>> resultado = new List<List<string>>();

            foreach (DataRow row in disciplinas.Rows)
            {

                List<string> temp = new List<string>();

                string id_disciplina = row["id_disciplina"].ToString();
                string cod_disciplina = row["ano_letivo"].ToString();
                string descricao = row["descricao"].ToString();

                temp.Add(id_disciplina);
                temp.Add(cod_disciplina);
                temp.Add(descricao);

                resultado.Add(temp);
            }

            mem.listaInscrito = resultado;

            return resultado;
        }

        public List<List<string>> getDisciplinasNaoInscrito(int cod_utilizador)
        {

            SqlConnection myConnection = ligacao_bd();
            memoria_partilhada mem = new memoria_partilhada();

            SqlCommand commandListaNaoInscrito = new SqlCommand("disciplinas_n_inscrito", myConnection);
            commandListaNaoInscrito.CommandType = CommandType.StoredProcedure;

            SqlParameter paramentLista = new SqlParameter("@cod_aluno", SqlDbType.Int);
            paramentLista.Value = cod_utilizador;
            paramentLista.Direction = ParameterDirection.Input;

            commandListaNaoInscrito.Parameters.Add(paramentLista);

            DataTable disciplinas = new DataTable();

            SqlDataAdapter teste = new SqlDataAdapter(commandListaNaoInscrito);

            teste.Fill(disciplinas);

            List<List<string>> resultado = new List<List<string>>();

            foreach (DataRow row in disciplinas.Rows)
            {

                List<string> temp = new List<string>();

                string id_disciplina = row["id_disciplina"].ToString();
                string cod_disciplina = row["ano_letivo"].ToString();
                string descricao = row["descricao"].ToString();

                temp.Add(id_disciplina);
                temp.Add(cod_disciplina);
                temp.Add(descricao);

                resultado.Add(temp);
            }

            mem.listaNaoInscrito = resultado;

            return resultado;
        }

        public string marcar_avaliacao(int cod_tipo_aval, int id_disciplina, int cod_professor, string data, string sala, int hora, int minutos, int peso)
        {
            SqlConnection myConnection = ligacao_bd();
            memoria_partilhada mem = new memoria_partilhada();

            SqlCommand commandListaAvaliacoes = new SqlCommand("criar_teste", myConnection);
            commandListaAvaliacoes.CommandType = CommandType.StoredProcedure;

            SqlParameter paramentLista = new SqlParameter("@cod_tipo_aval", SqlDbType.TinyInt);
            paramentLista.Value = cod_tipo_aval;
            paramentLista.Direction = ParameterDirection.Input;

            SqlParameter paramentLista1 = new SqlParameter("@id_disciplina", SqlDbType.Int);
            paramentLista1.Value = id_disciplina;
            paramentLista1.Direction = ParameterDirection.Input;

            SqlParameter paramentLista2 = new SqlParameter("@cod_professor", SqlDbType.Int);
            paramentLista2.Value = cod_professor;
            paramentLista2.Direction = ParameterDirection.Input;

            SqlParameter paramentLista3 = new SqlParameter("@data", SqlDbType.Date);
            paramentLista3.Value = data;
            paramentLista3.Direction = ParameterDirection.Input;

            SqlParameter paramentLista4 = new SqlParameter("@sala", SqlDbType.NVarChar);
            paramentLista4.Value = sala;
            paramentLista4.Direction = ParameterDirection.Input;

            SqlParameter paramentLista5 = new SqlParameter("@hora", SqlDbType.TinyInt);
            paramentLista5.Value = hora;
            paramentLista5.Direction = ParameterDirection.Input;

            SqlParameter paramentLista6 = new SqlParameter("@minutos", SqlDbType.TinyInt);
            paramentLista6.Value = minutos;
            paramentLista6.Direction = ParameterDirection.Input;

            SqlParameter paramentLista7 = new SqlParameter("@peso", SqlDbType.TinyInt);
            paramentLista7.Value = peso;
            paramentLista7.Direction = ParameterDirection.Input;

            commandListaAvaliacoes.Parameters.Add(paramentLista);
            commandListaAvaliacoes.Parameters.Add(paramentLista1);
            commandListaAvaliacoes.Parameters.Add(paramentLista2);
            commandListaAvaliacoes.Parameters.Add(paramentLista3);
            commandListaAvaliacoes.Parameters.Add(paramentLista4);
            commandListaAvaliacoes.Parameters.Add(paramentLista5);
            commandListaAvaliacoes.Parameters.Add(paramentLista6);
            commandListaAvaliacoes.Parameters.Add(paramentLista7);

            DataTable avaliacoes = new DataTable();

            SqlDataAdapter teste = new SqlDataAdapter(commandListaAvaliacoes);

            teste.Fill(avaliacoes);

            string resultado = "";

            foreach (DataRow row in avaliacoes.Rows)
            {
                resultado = row[0].ToString();
            }

            mem.mensagem = resultado;

            return resultado;
        }

        public List<List<string>> getDisciplinasLeciona(int cod_utilizador)
        {

            SqlConnection myConnection = ligacao_bd();
            memoria_partilhada mem = new memoria_partilhada();

            SqlCommand commandListaLeciona = new SqlCommand("disciplina_lecionada", myConnection);
            commandListaLeciona.CommandType = CommandType.StoredProcedure;

            SqlParameter paramentLista = new SqlParameter("@cod_docente", SqlDbType.Int);
            paramentLista.Value = cod_utilizador;
            paramentLista.Direction = ParameterDirection.Input;

            commandListaLeciona.Parameters.Add(paramentLista);

            DataTable disciplina_leciona = new DataTable();

            SqlDataAdapter teste = new SqlDataAdapter(commandListaLeciona);

            teste.Fill(disciplina_leciona);

            List<List<string>> resultado = new List<List<string>>();

            foreach (DataRow row in disciplina_leciona.Rows)
            {

                List<string> temp = new List<string>();

                string id_disciplina = row["id_disciplina"].ToString();
                string ano_letivo = row["ano_letivo"].ToString();
                string descricao = row["descricao"].ToString();

                temp.Add(id_disciplina);
                temp.Add(ano_letivo);
                temp.Add(descricao);

                resultado.Add(temp);
            }

            mem.listaleciona = resultado;

            return resultado;
        }

        
        public List<List<string>> getAvaliacoes(int id_disciplina)
        {

            SqlConnection myConnection = ligacao_bd();
            memoria_partilhada mem = new memoria_partilhada();

            SqlCommand commandListaAvaliacoes = new SqlCommand("get_avaliacoes", myConnection);
            commandListaAvaliacoes.CommandType = CommandType.StoredProcedure;

            SqlParameter paramentLista = new SqlParameter("@id_disciplina", SqlDbType.Int);
            paramentLista.Value = id_disciplina;
            paramentLista.Direction = ParameterDirection.Input;

            commandListaAvaliacoes.Parameters.Add(paramentLista);

            DataTable avaliacoes = new DataTable();

            SqlDataAdapter teste = new SqlDataAdapter(commandListaAvaliacoes);

            teste.Fill(avaliacoes);

            List<List<string>> resultado = new List<List<string>>();

            foreach (DataRow row in avaliacoes.Rows)
            {

                List<string> temp = new List<string>();

                string cod_avaliacao = row["cod_avaliacao"].ToString();
                string descricao = row["descricao"].ToString();
                string data_avaliacao = row["data_avaliacao"].ToString();
                string hora = row["hora"].ToString();
                string minutos = row["minutos"].ToString();
                string peso = row["peso"].ToString();
                string sala = row["sala"].ToString();

                temp.Add(cod_avaliacao);
                temp.Add(descricao);
                temp.Add(data_avaliacao);
                temp.Add(hora);
                temp.Add(minutos);
                temp.Add(peso);
                temp.Add(sala);

                resultado.Add(temp);
            }

            mem.listaavaliacoes = resultado;

            return resultado;
        }

        public List<List<string>> getInscritos(int id_avaliacao)
        {

            SqlConnection myConnection = ligacao_bd();
            memoria_partilhada mem = new memoria_partilhada();

            SqlCommand commandListaAvaliacoes = new SqlCommand("ver_inscritos", myConnection);
            commandListaAvaliacoes.CommandType = CommandType.StoredProcedure;

            SqlParameter paramentLista = new SqlParameter("@cod_aval", SqlDbType.Int);
            paramentLista.Value = id_avaliacao;
            paramentLista.Direction = ParameterDirection.Input;

            commandListaAvaliacoes.Parameters.Add(paramentLista);

            DataTable avaliacoes = new DataTable();

            SqlDataAdapter teste = new SqlDataAdapter(commandListaAvaliacoes);

            teste.Fill(avaliacoes);

            List<List<string>> resultado = new List<List<string>>();

            foreach (DataRow row in avaliacoes.Rows)
            {

                List<string> temp = new List<string>();

                string cod_aluno = row["cod_aluno"].ToString();
                string nome = row["nome"].ToString();
                string nota = row["nota"].ToString();


                temp.Add(cod_aluno);
                temp.Add(nome);
                temp.Add(nota);
                
                resultado.Add(temp);
            }

            mem.listaInscritoAval = resultado;

            return resultado;
        }

        public string Atribuir_Nota(int cod_aluno, int cod_aval, double nota)
        {

            SqlConnection myConnection = ligacao_bd();
            memoria_partilhada mem = new memoria_partilhada();

            SqlCommand commandListaAvaliacoes = new SqlCommand("atribuir_nota_avaliacao", myConnection);
            commandListaAvaliacoes.CommandType = CommandType.StoredProcedure;

            SqlParameter paramentLista = new SqlParameter("@cod_aluno", SqlDbType.Int);
            paramentLista.Value = cod_aluno;
            paramentLista.Direction = ParameterDirection.Input;

            SqlParameter paramentLista1 = new SqlParameter("@cod_avaliacao", SqlDbType.Int);
            paramentLista1.Value = cod_aval;
            paramentLista1.Direction = ParameterDirection.Input;

            SqlParameter paramentLista2 = new SqlParameter("@nota", SqlDbType.Real);
            paramentLista2.Value = nota;
            paramentLista2.Direction = ParameterDirection.Input;

            commandListaAvaliacoes.Parameters.Add(paramentLista);
            commandListaAvaliacoes.Parameters.Add(paramentLista1);
            commandListaAvaliacoes.Parameters.Add(paramentLista2);

            DataTable avaliacoes = new DataTable();

            SqlDataAdapter teste = new SqlDataAdapter(commandListaAvaliacoes);

            teste.Fill(avaliacoes);

            string resultado = "";

            foreach (DataRow row in avaliacoes.Rows)
            {
                resultado = row[0].ToString();
            }

            mem.mensagem = resultado;

            return resultado;
        }

        public string inscrever_disciplina(int cod_aluno, int cod_disciplina)
        {

            SqlConnection myConnection = ligacao_bd();
            memoria_partilhada mem = new memoria_partilhada();

            SqlCommand commandListaAvaliacoes = new SqlCommand("inscrever_disciplina", myConnection);
            commandListaAvaliacoes.CommandType = CommandType.StoredProcedure;

            SqlParameter paramentLista = new SqlParameter("@cod_aluno", SqlDbType.Int);
            paramentLista.Value = cod_aluno;
            paramentLista.Direction = ParameterDirection.Input;

            SqlParameter paramentLista1 = new SqlParameter("@cod_disciplina", SqlDbType.Int);
            paramentLista1.Value = cod_disciplina;
            paramentLista1.Direction = ParameterDirection.Input;

            commandListaAvaliacoes.Parameters.Add(paramentLista);
            commandListaAvaliacoes.Parameters.Add(paramentLista1);

            DataTable avaliacoes = new DataTable();

            SqlDataAdapter teste = new SqlDataAdapter(commandListaAvaliacoes);

            teste.Fill(avaliacoes);

            string resultado = "";

            foreach (DataRow row in avaliacoes.Rows)
            {
                resultado = row[0].ToString();
            }

            mem.mensagem = resultado;

            return resultado;
        }

        public string remover_avaliacao(int cod_avaliacao)
        {

            SqlConnection myConnection = ligacao_bd();
            memoria_partilhada mem = new memoria_partilhada();

            SqlCommand commandListaAvaliacoes = new SqlCommand("remover_avaliacao", myConnection);
            commandListaAvaliacoes.CommandType = CommandType.StoredProcedure;

            SqlParameter paramentLista = new SqlParameter("@cod_avaliacao", SqlDbType.Int);
            paramentLista.Value = cod_avaliacao;
            paramentLista.Direction = ParameterDirection.Input;

            commandListaAvaliacoes.Parameters.Add(paramentLista);

            DataTable avaliacoes = new DataTable();

            SqlDataAdapter teste = new SqlDataAdapter(commandListaAvaliacoes);

            teste.Fill(avaliacoes);

            string resultado = "";

            foreach (DataRow row in avaliacoes.Rows)
            {
                resultado = row[0].ToString();
            }

            mem.mensagem = resultado;

            return resultado;
        }
    }
}
